table of contents
system(3) | 2007-10-27-16:31 | system(3) |
Назва¶
system - виконує оболонкову команду
Огляд¶
#include <stdlib.h>
int system(const char *ланцюжок);
Опис¶
system() виконує команду, вказану як ланцюжок, через виклик /bin/sh -c ланцюжок і повертається до основної програми після завершення команди. Під час виконання команди, SIGCHLD блоковано, а SIGINT із SIGQUIT ігноруються.
Повернені значення¶
У випадку помилки, повертається -1 (тобто відгалуження зазнало невдачі) і значення повернення команди в протилежному випадку. Останній статус повернення відбувається у форматі, вказаному wait(2). Таким чином, код виходу команди буде WEXITSTATUS(status). У випадку, якщо /bin/sh неможливо виконати, статус виходу буде той самий, що й команди exit(127).
Якщо ланцюжок дорівнює NULL, system() поверне ненульове значення, акщо оболонка доступна і нуль, якщо ні.
system() не впливає на статус очікування додатківих дочірніх процесів.
Відповідність стандартам¶
ANSI C, POSIX.2, BSD 4.3
Примітки¶
Як було зказано, system() ігнорує SIGINT і SIGQUIT. Це може призвести до того, що програми, які викликають цю функцію з циклу можуть виявитись неперрервними, хіба вони попіклуються самі перевірити статус виходу дочірнього процесу. Тобто,
while(something) {
int ret = system("foo");
if (WIFSIGNALED(ret) &&
(WTERMSIG(ret) == SIGINT || WTERMSIG(ret) == SIGQUIT))
break;
}
Перевірка на наявність /bin/sh, власне, не відбувається; передбачається, що ця оболонка завжди присутня. ISO C вказує перевіряти, тоді як POSIX.2 відзначає, що повернене значення перевірки на наявність оболонки завжди повинне бути ненульовим, оскільки система баз оболонки не відповідає стандартові, і саме таким чином це втілено.
Є можливість, що оболонкова команда поверне 127, тож цей код не є надійним вказівником того, що execve() зазнав невдачі.
Дивіться також¶
2007-10-27-16:31 | © 2005-2007 DLOU, GNU FDL |